package com.promote.common.properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
/**
 * 文件属性获取
 * @author tarena
 * 
 */
public class FilePropertiesMap {
	public static Map<String, String> SYS_MAP = new HashMap<String, String>();

	public static Map<String, String> REDIS_MAP = new HashMap<String, String>();

	private static Map<String, Map<String, String>> PRO_MAP = new HashMap<String, Map<String, String>>();

	private static final String DEFAULT_PRO_NAME = "defaultpro";

	/**
	 * 系统加载配置文件
	 * 
	 * @param module
	 * @param map
	 */
	public static void addProperties(String module, Map<String, String> map) {
		if (StringUtils.isEmpty(module) || map == null || map.isEmpty()) {
			return;
		}
		PRO_MAP.put(module, map);
	}

	/**
	 * 系统加载配置文件
	 * 
	 * @param key
	 * @param value
	 */
	public static void addProperties(String module, String key, String value) {
		if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
			return;
		}
		if (StringUtils.isEmpty(module)) {
			module = DEFAULT_PRO_NAME;
		}
		if (!PRO_MAP.containsKey(module)) {
			PRO_MAP.put(module, new HashMap<String, String>());
		}
		PRO_MAP.get(module).put(key, value);
	}

	/**
	 * 从内存中读取变量值
	 *
	 * @param key 变量名称
	 * @return 变量值
	 */
	public static String getValue(String key) {
		if (StringUtils.isEmpty(key)) {
			return null;
		}
		Set<String> keys = PRO_MAP.keySet();
		for (String file : keys) {
			String value = getItemValue(file, key);
			if (value != null) {
				return value;
			}
		}
		return null;
	}

	/**
	 * 从系统中读取配置集合
	 *
	 * @param file 配置分类
	 * @return 配置分类对应的 key-value集合
	 */
	public static Map<String, String> getMap(String file) {
		if (StringUtils.isEmpty(file)) {
			return Collections.emptyMap();
		}
		file = file.trim().toLowerCase();
		return PRO_MAP.get(file);
	}

	/**
	 * 从系统中读取配置集合
	 * 
	 * @return 配置分类对应的 key-value集合
	 */
	public static Collection<Map<String, String>> getAllMap() {
		return PRO_MAP.values();
	}

	/**
	 * 从系统中读取配置集合
	 * 
	 * @return 配置分类对应的 key-value集合
	 */
	public static Collection<String> getAllFile() {
		return PRO_MAP.keySet();
	}

	/**
	 * 从指定的分类中读取变量值
	 *
	 * @param file 配置分类
	 * @param key  配置变量
	 * @return 配置信息
	 */
	public static String getItemValue(String file, String key) {
		if (StringUtils.isEmpty(file) || StringUtils.isEmpty(key)) {
			return null;
		}
		file = file.trim().toLowerCase();
		if (!PRO_MAP.containsKey(file)) {
			return null;
		}
		return PRO_MAP.get(file).get(key);
	}

	/**
	 * 从指定分类中读取变量值
	 *
	 * @param file         配置分类
	 * @param key          配置变量
	 * @param defaultValue 默认值
	 * @return 配置信息
	 */
	public static String getItemDefaultValue(String file, String key, String defaultValue) {
		if (StringUtils.isEmpty(file) || StringUtils.isEmpty(key)) {
			return null;
		}
		String value = getItemValue(file, key);
		if (value == null) {
			return defaultValue;
		}
		return value;
	}

	/**
	 * 从内存中读取变量值
	 *
	 * @param key          配置变量
	 * @param defaultValue 默认值
	 * @return 配置信息
	 */
	public static String getDefaultValue(String key, String defaultValue) {
		String value = getValue(key);
		if (value == null) {
			return defaultValue;
		}
		return value;
	}

	public static Map<String, String> cacheProperties(String propName) {
		Map<String, String> map = new HashMap<>();
		ClassPathResource cp = new ClassPathResource(propName + ".properties");
		Properties properties = new Properties();// new OrderedProperties();
		try(InputStream inputStream = cp.getInputStream();) {
			if (cp.exists() && cp.isReadable()) {
				properties.load(inputStream);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		for (Iterator<?> its = properties.keySet().iterator(); its.hasNext();) {
			String zkey = (String) its.next();
			map.put(zkey, properties.getProperty(zkey).trim());
		}
		return map;
	}
}
